Next/v0.1.0 - #13
Conversation
- document first-pass config resolver discovery, precedence, cache, and logging contract - classify current implementation defaults as config, operational input, request data, or derived output - set mesh and Knop inventory history defaults to current-only - align default config-resolution RDF with layer, merge, and inheritance roles
- set the default ResourcePage generation policy to generate - remove role-specific page generation overrides made redundant by the baseline - update config synthesis notes so suppression and deferral are explicit opt-outs
- document first-pass ResourcePage policy granularity - defer page-kind suppression for Knop, IRI, history, state, and manifestation pages
- load and validate Weave default application and config-resolution RDF - expose history and ResourcePage policy lookup by artifact role - parse default resolver policy, max reference depth, and layer ordering - add fail-closed tests for unknown policy values and duplicate role policies
- model first-pass Knop inherited config propagation in runtime/config - cover accept/propagate, accept-but-stop, block inherited, descendant-only, and self-inclusive offers - keep the implementation pure so fixture-backed behavior does not change yet - update config synthesis checklist and codebase overview
Move mesh support ResourcePage planning out of the large core weave facade into a dedicated module while preserving existing exports from core/weave/weave.ts. Add small shared modules for WeaveInputError and VersionPlan so extracted planners can avoid importing through the facade. Document the refactor slice and current fixture-ladder test status.
Add a shared support-history policy seam and thread Weave default effective history policies through runtime version planning. Apply the policy to first Knop and first payload weave outputs so KnopMetadata can remain current-only while payload and inventory histories stay unchanged. Keep mesh support ResourcePage catch-up on the shared helper and add focused planner tests for current-only KnopMetadata behavior.
Parse default history, state, and manifestation naming policies from the Weave default application config and pass them through runtime version planning. Apply those policies to first and second payload version layout without changing ordinal default behavior, while requiring explicit segments for non-inferable named/semver/date cases and lightly validating semver/date state segments. Update focused config and weave planner tests, and record the Phase 3 naming policy bridge in the task/codebase notes.
- Add a runtime ResourcePage policy helper that maps page facts back to owning artifact roles. - Filter generated page paths through effective resource-page policies for generate, suppress, defer, and explicit-target onRequest. - Wire executeGenerate to load the effective config before materializing ResourcePages. - Add focused policy tests for generated, suppressed, and on-request pages. - Update grand config synthesis and codebase overview notes with the new runtime materialization seam.
- Move ResourcePage policy resolution into core so version planning and runtime generation share the same ownership rules. - Filter planned inventory Turtle to remove suppressed/deferred sflo:hasResourcePage facts and matching ResourcePage blocks. - Filter created page models so plans no longer promise pages omitted by policy. - Wire effective ResourcePage generation policies through runtime version planning and mesh support catch-up. - Add focused tests for suppressed payload and support config ResourcePage facts.
Add the default ResourcePage regeneration config policy to the runtime effective-config model, including validation for unsupported RDF terms. Document the completed parse/validation slice while leaving actual historical ResourcePage regeneration behavior as a separate runtime task.
Sketch the render/provenance manifest contract needed for historical ResourcePage regeneration and audit the mutable inventory facts that block inventory from becoming fully current-only by default. Link the grand config synthesis task to the manifest/checkpoint prerequisite while leaving runtime historical regeneration behavior open.
Update ResourcePage policy ownership so history and state page ownership is derived from stable membership facts instead of current/latest progression pointers. Add a regression test proving mutable currentArtifactHistory and latestHistoricalState facts alone do not make historical pages inherit an artifact role policy.
Record the agreed _meta progression contract for current/history pointers, allocator ordinals, and optional next-segment hints. Clarify that explicit or hinted names control minted paths while ordinal counters continue monotonically for future anonymous allocations.
Document that durable next history/state segment hints need API and CLI set/clear operations distinct from one-shot operation segment requests. Clarify that clearing a hint never rewinds or recalculates ordinal allocator state.
- read MeshInventory current/latest/next progression from _mesh/_meta for first Knop, first payload, and first extracted-Knop weave planning - consume optional next-state segment hints while preserving monotonic ordinal advancement - write advanced MeshInventory progression back to _mesh/_meta and keep inventory focused on stable history/state membership - pass current MeshMetadata through runtime version planning - add focused tests for hinted MeshInventory state names and ordinal fallback after named latest states - update grand config and optional-history notes with the implemented _meta progression seam
- record Alice Bio and Sidecar Fantasy Rules transition inventory - require exact replay commands for command-backed fixture rungs - require explicit source provenance for manual, copied, fetched, and derived fixture bytes - document command-incomplete rungs that need fileOperation replay support
- note that replay commands and source provenance should use an Accord-owned contract - link the Weave fixture ladder task to the Accord generalized replay task
- add root deno.json version metadata and expose it through weave --version - add version tests and focused CLI coverage - add bump-version script for patch/minor/major/explicit version updates - create or verify Dendron release-note stubs during version bumps - add v0.1.0 release-note stub - record current CI gate drift in the full CI/CD task note
- add shared release platform metadata for binary and npm package naming - add build:binaries task that compiles native executables and writes bundle metadata - add release metadata tests - update the release runbook and CI/CD task note for the current packaging state
- add package:binaries for release archives and checksum files - add Deno-native tar.gz, zip, and sha256 helpers - include bundle metadata, README, and LICENSE in binary archives - validate packaged bundle metadata against the root release version - update release runbook and CI/CD task status
- add shared release platform metadata for binary and npm package naming - add build:binaries task that compiles native executables and writes bundle metadata - add release metadata tests - update the release runbook and CI/CD task note for the current packaging state
- add npm wrapper and platform package assembly script - generate wrapper bin dispatch for native platform packages - add platform package metadata with os and cpu constraints - validate assembled packages against bundle metadata and root version - update release runbook and CI/CD task status
- add publish metadata to generated npm package manifests - write npm-packages-metadata.json during npm package assembly - make npm install smoke consume the package metadata manifest - test package publish metadata and host platform package resolution - update release runbook and CI/CD task status
…t/v0.1.0 # Conflicts: # deno.json # documentation/notes/dev.release-runbook.md # documentation/notes/wd.task.2026.2026-05-13-full-ci-cd.md # scripts/assemble-npm-packages.ts # scripts/release/npm.ts # tests/scripts/assemble_npm_packages_test.ts
- add ordered npm dry-run/publish script for assembled packages - add release workflow for native binaries, archives, npm assembly, smoke tests, npm publish, and GitHub Release handling - update release runbook and CI/CD task note for the packaged release path
- split publication-branch bootstrap from first materialization - record default inference for source ref, mesh base, and gh-pages branch root - clarify that digests and target bindings are not required for empty branch bootstrap - define publication controls as branch, Pages, commit, push, and preservation policy
Tune the extracted Source metadata chip so pinned source histories read as chip-within-chip containment instead of adjacent segmented tabs.
Add row-level metadata styling so the extracted Source label and chip align vertically without changing the rest of the metadata table.
…ted pills for source; moved children to separate section
Record candidate ReferenceLink derivation from extraction provenance as a future explicit curation/proposal API, while keeping manual references as the current path.
- add current-mode canonical ReferenceLink rungs for representative extracted terms - allow first ReferenceCatalog weave against slim mesh inventories - cover final branch-published fixture references in integration tests
- Install the test temp cleanup wrapper when the shared test temp helper is imported, covering IDE and direct deno test invocations that bypass the task preload. - Move the publish npm packages test off a hand-rolled .test-tmp path and onto createTestTmpDir so it participates in cleanup.
- add managed reference link data to identifier ResourcePage models - render Properties from source triples where the page resource is subject - render canonical, supplemental, and deprecated References groups - use canonical reference target payload data as source facts when available - cover renderer behavior and generated identifier reference pages
Derive all-terms support skips from rdf:type membership in mesh/source inventories and source payload RDF instead of path string shape. This prevents source artifact history components such as ontology/releases/v0.0.2 from being extracted into their own Knops while preserving ordinary named term extraction.
Move subject triples with blank-node objects out of the Properties panel and render them in a dedicated Blank Nodes panel with predicate/code table rows.
Suppress arbitrary blank node identifiers in ResourcePage Blank Nodes panels. Render root blank node content as Turtle-style predicate/object lines, while preserving nested blank node structure with bracketed inline blocks. Keep blank node triples out of the Properties panel and cover the display behavior in ResourcePage tests.
…tion Load ancestor Knop inventory history groups when planning generated ResourcePages so an extracted identifier that is also an artifact history component still renders as a Semantic Flow history resource. This keeps release-state pages such as ontology/releases/v0.0.2 classified as sflo:HistoricalState instead of treating them as ordinary extracted terms with Source metadata.
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 Walkthrough<review_stack_artifact> </review_stack_artifact> WalkthroughAdds a manual GitHub Actions release workflow, Deno release/packaging/publish scripts, gh-pages deploy tooling, effective-config parsing and inheritance, resource-page policy logic, extraction-source registry with evidence, weave runtime/pages and reference handling, mesh/knop planner and /ttl layout changes, CLI/version/logging updates, and broad tests/docs updates. ChangesUnified Feature Sweep
Estimated code review effort
✨ Finishing Touches🧪 Generate unit tests (beta)
|
- replace v0.1.0 release-note placeholders - update release gate and runbook status after clean local ci - defer durable next-segment hint APIs past v0.1.0
There was a problem hiding this comment.
Actionable comments posted: 16
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
tests/e2e/payload_update_cli_test.ts (1)
32-36:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winTransient source file now contaminates workspace snapshot assertions.
Placing
alice-bio-v2.ttlunderworkspaceRootcan make the file-list comparison fail, since only.weave/is excluded. Prefer writing this input in a separate temp dir (previous behavior) or delete the temp source file beforelistRelativeFiles(...).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/e2e/payload_update_cli_test.ts` around lines 32 - 36, The transient test input file is being written into workspaceRoot (via sourcePath + Deno.writeTextFile using readMeshAliceBioBranchFile), which contaminates workspace snapshot assertions; change the test to write the temp source into a separate temp directory (e.g., create a temp dir with Deno.makeTempDir and set sourcePath there) or ensure the file is removed before calling listRelativeFiles(...) by calling Deno.remove(sourcePath) once the test step that needs it finishes; update references to sourcePath/transitionCase accordingly so the test uses the isolated temp path or deletes the file prior to snapshot comparison.src/runtime/mesh/inventory.ts (1)
281-308:⚠️ Potential issue | 🟠 Major | ⚡ Quick winOptional
sourceRegistryTurtlecurrently causes hard failure when omitted.
sourceRegistryQuadsbecomes[]whensourceRegistryTurtleis undefined, but subsequent required extraction-source lookups run against that empty set, so valid inventories fail unexpectedly. Use inventory quads as fallback.Proposed fix
- const sourceRegistryQuads = sourceRegistryTurtle === undefined - ? [] + const sourceRegistryQuads = sourceRegistryTurtle === undefined + ? inventoryQuads : parseInventoryQuads( meshBase, sourceRegistryTurtle, messages.parseErrorMessage, );🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/mesh/inventory.ts` around lines 281 - 308, The optional sourceRegistryTurtle is being turned into an empty sourceRegistryQuads which makes subsequent lookups fail; change the creation of sourceRegistryQuads so that when sourceRegistryTurtle is undefined it falls back to using inventoryQuads instead of [], i.e. replace the current ternary so the false branch returns inventoryQuads and otherwise calls parseInventoryQuads(meshBase, sourceRegistryTurtle, messages.parseErrorMessage); keep the later checks using hasNamedNodeObject(extractionSourceIri, RDF_TYPE_IRI, SFLO_EXTRACTION_SOURCE_IRI) and the existing error throw with messages.missingExtractionSourceMessage.src/runtime/weave/weave.ts (1)
1332-1340:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy liftResolve pinned source snapshots from inventory, not from the working filename.
For non-latest pinned states, this falls back to
toPayloadHistoricalSnapshotPath(...), which assumes the manifestation path is${state}/<derived-from-working-file>. That breaks when the source history uses non-default manifestation naming (_m0001, named manifestations, etc.), so extracted-source weave can read the wrong snapshot or fail even though the inventory already records the real state file.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/weave/weave.ts` around lines 1332 - 1340, The code currently falls back to toPayloadHistoricalSnapshotPath(...) for non-latest pinned states, which uses the working filename and breaks for non-default manifestation names; change selectedHistoricalSnapshotPath resolution to first look up the snapshot path recorded in the artifact/inventory for the specific state (e.g. check sourcePayloadArtifact.historicalSnapshots or a manifest/manifestation map keyed by state such as sourcePayloadArtifact.historicalSnapshotPathMap[sourceState] or sourcePayloadArtifact.manifestationByState[selectedHistoricalStatePath]) and use that if present, only falling back to toPayloadHistoricalSnapshotPath(selectedHistoricalStatePath, sourcePayloadArtifact.workingLocalRelativePath) when no inventory entry exists; update the logic around selectedHistoricalSnapshotPath to prefer inventory-resolved snapshot paths over deriving from the working filename.
🧹 Nitpick comments (6)
src/core/integrate/integrate_test.ts (1)
140-141: ⚡ Quick winMake semantic-normalization replacement less fixture-path-specific.
The replacement is tied to one concrete subject path (
_s0002/ttl), which can make this semantic-equivalence test fail on unrelated fixture renumbering.Suggested refactor
- .replace( - "<_mesh/_inventory/_history001/_s0002/ttl> a sflo:ArtifactManifestation, sflo:RdfDocument ;", - "<_mesh/_inventory/_history001/_s0002/ttl> rdf:type sflo:RdfDocument, sflo:ArtifactManifestation ;", - ); + .replace( + /(<[^>]+>) a sflo:ArtifactManifestation, sflo:RdfDocument ;/, + "$1 rdf:type sflo:RdfDocument, sflo:ArtifactManifestation ;", + );🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/core/integrate/integrate_test.ts` around lines 140 - 141, The test's semantic-normalization replacement currently targets the concrete subject string "<_mesh/_inventory/_history001/_s0002/ttl>", which breaks when fixture IDs are renumbered; update the replacement in integrate_test.ts to use a path-agnostic pattern (e.g. match the "_s" segment with digits or a wildcard) instead of the literal "_s0002/ttl" so both occurrences ("<_mesh/_inventory/_history001/_s0002/ttl> a sflo:ArtifactManifestation, sflo:RdfDocument ;" and "<_mesh/_inventory/_history001/_s0002/ttl> rdf:type sflo:RdfDocument, sflo:ArtifactManifestation ;") are normalized by the regex/pattern and not tied to a specific fixture number.src/runtime/weave/pages.ts (1)
2394-2403: ⚡ Quick winRedundant call to
classifyHistoryComponentResourcePage.The function is called twice in sequence when the first call returns a truthy value - once to check the condition and once to return the result. This duplicates the work of iterating through history groups.
♻️ Proposed fix to avoid duplicate call
- if ( - classifyHistoryComponentResourcePage(resourcePath, historyGroups) - ) { - return classifyHistoryComponentResourcePage(resourcePath, historyGroups)!; - } - return rdfClass( + const historyClass = classifyHistoryComponentResourcePage(resourcePath, historyGroups); + return historyClass ?? rdfClass( "sflo:DigitalArtifact", `${SFLO_NAMESPACE}DigitalArtifact`, ); -}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/weave/pages.ts` around lines 2394 - 2403, The code calls classifyHistoryComponentResourcePage(resourcePath, historyGroups) twice causing duplicate work; fix by calling it once, storing the result in a local variable (e.g., const classified = classifyHistoryComponentResourcePage(resourcePath, historyGroups)), then if (classified) return classified; otherwise return the rdfClass("sflo:DigitalArtifact", `${SFLO_NAMESPACE}DigitalArtifact`). Update the block containing classifyHistoryComponentResourcePage, resourcePath, historyGroups and the rdfClass fallback accordingly.src/runtime/extract/extract.ts (3)
1743-1745: ⚡ Quick winTurtle string escaping may be incomplete.
escapeTurtleStringonly escapes backslash and double-quote. Turtle string literals can also contain newlines, tabs, and other control characters that need escaping (\n,\t,\r). If source evidence values contain such characters, the generated Turtle may be malformed.♻️ Proposed fix to handle more escape sequences
function escapeTurtleString(value: string): string { - return value.replaceAll("\\", "\\\\").replaceAll('"', '\\"'); + return value + .replaceAll("\\", "\\\\") + .replaceAll('"', '\\"') + .replaceAll("\n", "\\n") + .replaceAll("\r", "\\r") + .replaceAll("\t", "\\t"); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/extract/extract.ts` around lines 1743 - 1745, The escapeTurtleString function only escapes backslashes and double quotes which can yield invalid Turtle when values contain control characters; update escapeTurtleString to also escape newline, carriage return, tab (and optionally backspace/form-feed) sequences (e.g., replace \n -> \\n, \r -> \\r, \t -> \\t) and ensure replacements run on the original string (or use a single pass replacer) so every control char is converted before returning; locate the escapeTurtleString function and add these additional escapes to its replacement logic.
1747-1749: 💤 Low valueTurtle block splitting may fail on complex Turtle files.
The regex
/\n\s*\n/gsplits on any blank line. This could incorrectly split multiline string literals that contain blank lines, or fail to split blocks that aren't separated by blank lines. For the current use case (extraction source blocks in inventory files), this is likely fine, but consider adding a comment documenting this limitation.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/extract/extract.ts` around lines 1747 - 1749, The splitTurtleBlocks function currently uses turtle.trim().split(/\n\s*\n/g) which splits on any blank line and can incorrectly break Turtle multiline string literals or miss other block boundaries; update the function by adding a clear comment above splitTurtleBlocks stating that it deliberately splits on blank lines, that it will not preserve blank lines inside multiline string literals (and therefore may split inside """...""" or '''...''' literals), and note that a full Turtle-aware parser would be needed to avoid this; optionally mention intended acceptable input shape for callers (extraction source blocks) so future maintainers know this limitation.
2005-2008: 💤 Low valueRedundant conditional logic.
The condition at line 2005 checks
term.datatype.value !== XSD_ANY_URI_IRI && !isUrlLiteral(term.value), but line 2008 only returns the value ifisUrlLiteral(term.value)is true. This means when the datatype isxsd:anyURIbutisUrlLiteralreturns false, the function returnsundefinedinstead of the URI value, which may be unintended.♻️ Proposed fix to simplify the logic
function toPropertyObjectHref(term: Quad["object"]): string | undefined { if (term.termType === "NamedNode") { return term.value; } if (term.termType !== "Literal") { return undefined; } - if (term.datatype.value !== XSD_ANY_URI_IRI && !isUrlLiteral(term.value)) { - return undefined; - } - return isUrlLiteral(term.value) ? term.value : undefined; + if (term.datatype.value === XSD_ANY_URI_IRI || isUrlLiteral(term.value)) { + return term.value; + } + return undefined; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/extract/extract.ts` around lines 2005 - 2008, The current conditional mixes checks on term.datatype.value and isUrlLiteral(term.value) such that when datatype === XSD_ANY_URI_IRI but isUrlLiteral(...) is false the function returns undefined; change the logic so that if term.datatype.value === XSD_ANY_URI_IRI you return term.value unconditionally, otherwise only return term.value when isUrlLiteral(term.value) is true. Update the conditional that currently uses XSD_ANY_URI_IRI and isUrlLiteral to a simpler OR-based check (or two-branch check) so the XSD_ANY_URI_IRI case always yields term.value and non-anyURI relies on isUrlLiteral.src/core/knop/create.ts (1)
255-280: 💤 Low valueTry-catch fallback for shape detection may silently swallow unexpected errors.
The code catches all
KnopCreateInputErrorexceptions when trying the legacy shape, then falls back to the working shape. If the legacy shape fails for reasons other than shape mismatch (e.g., malformed data that partially matches), this could mask issues. Consider logging a debug message when falling back.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/core/knop/create.ts` around lines 255 - 280, When attempting legacy shape detection in createKnop (the try block that calls assertHasLegacyCurrentMeshInventoryShapeForKnopCreate), the catch currently swallows KnopCreateInputError and falls back silently; update the catch to log a debug-level message including the error details (e.g., error.message or error.stack) and context (that legacy detection failed and we're falling back to assertHasWorkingCurrentMeshInventoryShapeForKnopCreate) before continuing, while still rethrowing any non-KnopCreateInputError as currently implemented.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/release-manual.yml:
- Line 63: The workflow references the non-existent tag denoland/setup-deno@v2;
update every occurrence of the action usage (lines where you have "uses:
denoland/setup-deno@v2") to a specific published patch tag such as
denoland/setup-deno@v2.0.4 (or another exact v2.x.x release) so the action
resolves correctly at runtime; leave other actions like actions/checkout@v6,
actions/setup-node@v6, actions/upload-artifact@v7, actions/download-artifact@v8
unchanged.
In `@documentation/notes/release-notes.v0.1.0.md`:
- Around line 11-35: The release notes file currently contains placeholder
"TODO" entries under the headings "## Highlights", "## Breaking Or Changed
Behavior", "## Artifacts", "## Validation", "## Known Limitations", and "##
Next"; replace each TODO with concrete content for v0.1.0: fill "## Highlights"
with key features and user-visible changes, "## Breaking Or Changed Behavior"
with any API/behavior changes and migration notes, "## Artifacts" with
build/releases/assets and links, "## Validation" with test/QA status or coverage
notes, "## Known Limitations" with known issues and workarounds, and "## Next"
with planned follow-ups or roadmap items so the v0.1.0 release notes are
complete and accurate.
In `@documentation/notes/wu.repository-options.md`:
- Line 5: Remove the manual update to the "updated" timestamp in the document:
revert or delete the line that sets `updated: 1778817945812` so the note does
not contain an explicit updated field; rely on Dendron to manage the `updated`
metadata automatically and ensure no other hard-coded `updated` entries remain
in this note.
In `@scripts/assemble-npm-packages.ts`:
- Around line 278-283: The resolveRootPath function currently treats only POSIX
absolute paths (path.startsWith("/")) as absolute; update it to use Node's
cross-platform path.isAbsolute (or path.isAbsolute from 'path') to detect
Windows (e.g., "C:\\..." or UNC "\\\\...") and POSIX absolute paths, then return
the path unchanged when isAbsolute(path) is true; otherwise continue to
join(root, path). Ensure the file imports/uses the same path module symbol
(e.g., isAbsolute and join) that the rest of the file uses.
In `@scripts/build-binaries.ts`:
- Around line 138-143: The resolveRepoPath function currently checks absolute
paths with path.startsWith("/") which fails on Windows; update resolveRepoPath
to use isAbsolute from `@std/path` (import isAbsolute) and return the input path
when isAbsolute(path) is true, otherwise return join(repoRoot, path); ensure the
import for join remains and replace the startsWith check with isAbsolute(path)
to correctly handle Windows-style absolute paths like C:\.
In `@scripts/bump-version.ts`:
- Around line 94-104: The exported function bumpVersion currently assumes CLI
validated XOR of options.version and options.increment; add an explicit check at
the start of bumpVersion to enforce exclusivity: if neither options.version nor
options.increment is provided, or if both are provided, throw a clear,
descriptive error (e.g., "Either version or increment must be provided, but not
both") before calling requireVersionString/incrementVersion; reference the
options parameter and the variables options.version and options.increment so
callers get a consistent validation regardless of invocation source.
In `@scripts/package-binaries.ts`:
- Around line 233-237: The resolveRootPath function incorrectly treats only
POSIX-style absolute paths by checking path.startsWith("/"); replace that check
with Node's cross-platform check (path.isAbsolute) so Windows paths (e.g.
C:\...) are detected as absolute and returned unchanged; update the
resolveRootPath implementation to call path.isAbsolute(path) and return path
when true, otherwise return join(root, path), and ensure the 'path' module is
imported where resolveRootPath is defined.
In `@scripts/publish-npm-packages.ts`:
- Around line 288-292: The resolveRootPath function currently detects absolute
paths with path.startsWith("/") which fails on Windows; import and use
isAbsolute from `@std/path` (or node's path.isAbsolute equivalent) to check if the
provided path is absolute, returning it directly when true and otherwise
returning join(root, path); apply the same change for the identical patterns in
scripts/smoke-npm-install.ts (function around line ~340),
scripts/package-binaries.ts (around ~233) and scripts/assemble-npm-packages.ts
(around ~278) so all platform-aware absolute path checks use isAbsolute instead
of startsWith.
In `@scripts/smoke-npm-install.ts`:
- Around line 51-54: The switch's "case \"--\": break;" only exits the switch,
not the surrounding argument-processing loop, so trailing args are still parsed;
update the handler for argument variable "arg" (the switch block) to stop
parsing when "--" is seen—either by breaking out of the outer loop (e.g., set a
stopParsing flag checked by the loop or perform a loop-level break/return)
instead of just breaking the switch, ensuring no further options are processed
after the delimiter.
In `@src/cli/run.ts`:
- Around line 939-950: The deploy output never logs result.updatedPaths (only
materializedSource.updatedPaths), so publish updates like CNAME/.nojekyll
silently; update the printing logic in the block that calls
describeGHPagesDeployBootstrapResult(result) to iterate and console.log
result.updatedPaths exactly once (e.g., after printing result.createdPaths), and
stop separately re-printing materializedSource.updatedPaths since
result.updatedPaths already includes those; you can still print
materializedSource.createdPaths if needed, but ensure
materializedSource.updatedPaths is not double-logged.
In `@src/core/extract/extract.ts`:
- Around line 239-245: normalizeNonEmptyLiteral currently trims but does not
escape control characters, allowing values containing \n, \r, or \t to produce
invalid Turtle; update normalizeNonEmptyLiteral to call the Turtle escaping
helper (escapeTurtleString) or extend that helper to also escape control chars
(at minimum replace \n, \r, \t with their escaped forms) and return the escaped
trimmed string so all evidence literals emitted (including where
normalizeNonEmptyLiteral is used) produce valid Turtle; apply the same fix to
the other similar occurrence noted around lines 895-897.
In `@src/runtime/deploy/gh_pages.ts`:
- Around line 592-600: normalizeCname currently only trims and rejects
empties/newlines; change it to validate that the value is a bare hostname and
throw GHPagesDeployInputError for anything else. Specifically, inside
normalizeCname(value: string) after trimming, reject if the string contains a
scheme ("://"), path ("/"), port (":" followed by digits), whitespace, or
illegal chars (e.g. underscores), and enforce a hostname regex (labels of
letters/digits/hyphen, separated by dots, length limits) — if the check fails,
throw new GHPagesDeployInputError("cname must be a valid bare hostname"); keep
the existing empty/newline checks but replace the permissive return with this
stricter validation.
In `@src/runtime/weave/weave.ts`:
- Around line 525-553: The helper loadEffectiveConfigForExecution currently
always calls loadWeaveDefaultEffectiveConfig() — change it to start from the
mesh/workspace resolved effective config instead of the defaults (i.e., replace
the call to loadWeaveDefaultEffectiveConfig() with the function that returns the
mesh/resolved workspace EffectiveConfig), then construct the new
EffectiveConfigValue from that resolved config (preserve its sources,
configResolution, namingPolicies, resourcePageRegenerationConfigPolicy and
resourcePageGenerationPolicyForArtifactRole) and only apply
historyTrackingPolicyOverride to defaultHistoryTrackingPolicy and
historyTrackingByRole (using ALL_ARTIFACT_ROLES), leaving all other policies
from the resolved config intact.
- Around line 1383-1433: loadKnopSourceRegistryArtifact currently joins
workspaceRoot with workingLocalRelativePath straight from inventory, allowing
path traversal; before reading the file with readTextFileWithOverlay ensure the
same local-path policy used elsewhere is applied to
sourceRegistryState.workingLocalRelativePath (e.g., validate/normalize it
against workspaceRoot, reject or resolve any ../ segments outside the workspace,
or call the existing helper used for payload/reference-catalog path checks), and
only then call readTextFileWithOverlay; update error messages to reflect the
validated path and keep existing Deno.errors.NotFound handling in
loadKnopSourceRegistryArtifact.
In `@tests/e2e/deploy_gh_pages_cli_test.ts`:
- Line 6: The test builds cliPath using new URL("src/main.ts",
repoRoot).pathname which yields Windows-incompatible paths; change cliPath to
use fromFileUrl(new URL("src/main.ts", repoRoot)) from `@std/path` instead, and
add the corresponding import for fromFileUrl (ensure
tests/e2e/deploy_gh_pages_cli_test.ts imports fromFileUrl) so the file URL is
converted to a platform-correct file path before use.
---
Outside diff comments:
In `@src/runtime/mesh/inventory.ts`:
- Around line 281-308: The optional sourceRegistryTurtle is being turned into an
empty sourceRegistryQuads which makes subsequent lookups fail; change the
creation of sourceRegistryQuads so that when sourceRegistryTurtle is undefined
it falls back to using inventoryQuads instead of [], i.e. replace the current
ternary so the false branch returns inventoryQuads and otherwise calls
parseInventoryQuads(meshBase, sourceRegistryTurtle, messages.parseErrorMessage);
keep the later checks using hasNamedNodeObject(extractionSourceIri,
RDF_TYPE_IRI, SFLO_EXTRACTION_SOURCE_IRI) and the existing error throw with
messages.missingExtractionSourceMessage.
In `@src/runtime/weave/weave.ts`:
- Around line 1332-1340: The code currently falls back to
toPayloadHistoricalSnapshotPath(...) for non-latest pinned states, which uses
the working filename and breaks for non-default manifestation names; change
selectedHistoricalSnapshotPath resolution to first look up the snapshot path
recorded in the artifact/inventory for the specific state (e.g. check
sourcePayloadArtifact.historicalSnapshots or a manifest/manifestation map keyed
by state such as sourcePayloadArtifact.historicalSnapshotPathMap[sourceState] or
sourcePayloadArtifact.manifestationByState[selectedHistoricalStatePath]) and use
that if present, only falling back to
toPayloadHistoricalSnapshotPath(selectedHistoricalStatePath,
sourcePayloadArtifact.workingLocalRelativePath) when no inventory entry exists;
update the logic around selectedHistoricalSnapshotPath to prefer
inventory-resolved snapshot paths over deriving from the working filename.
In `@tests/e2e/payload_update_cli_test.ts`:
- Around line 32-36: The transient test input file is being written into
workspaceRoot (via sourcePath + Deno.writeTextFile using
readMeshAliceBioBranchFile), which contaminates workspace snapshot assertions;
change the test to write the temp source into a separate temp directory (e.g.,
create a temp dir with Deno.makeTempDir and set sourcePath there) or ensure the
file is removed before calling listRelativeFiles(...) by calling
Deno.remove(sourcePath) once the test step that needs it finishes; update
references to sourcePath/transitionCase accordingly so the test uses the
isolated temp path or deletes the file prior to snapshot comparison.
---
Nitpick comments:
In `@src/core/integrate/integrate_test.ts`:
- Around line 140-141: The test's semantic-normalization replacement currently
targets the concrete subject string "<_mesh/_inventory/_history001/_s0002/ttl>",
which breaks when fixture IDs are renumbered; update the replacement in
integrate_test.ts to use a path-agnostic pattern (e.g. match the "_s" segment
with digits or a wildcard) instead of the literal "_s0002/ttl" so both
occurrences ("<_mesh/_inventory/_history001/_s0002/ttl> a
sflo:ArtifactManifestation, sflo:RdfDocument ;" and
"<_mesh/_inventory/_history001/_s0002/ttl> rdf:type sflo:RdfDocument,
sflo:ArtifactManifestation ;") are normalized by the regex/pattern and not tied
to a specific fixture number.
In `@src/core/knop/create.ts`:
- Around line 255-280: When attempting legacy shape detection in createKnop (the
try block that calls assertHasLegacyCurrentMeshInventoryShapeForKnopCreate), the
catch currently swallows KnopCreateInputError and falls back silently; update
the catch to log a debug-level message including the error details (e.g.,
error.message or error.stack) and context (that legacy detection failed and
we're falling back to assertHasWorkingCurrentMeshInventoryShapeForKnopCreate)
before continuing, while still rethrowing any non-KnopCreateInputError as
currently implemented.
In `@src/runtime/extract/extract.ts`:
- Around line 1743-1745: The escapeTurtleString function only escapes
backslashes and double quotes which can yield invalid Turtle when values contain
control characters; update escapeTurtleString to also escape newline, carriage
return, tab (and optionally backspace/form-feed) sequences (e.g., replace \n ->
\\n, \r -> \\r, \t -> \\t) and ensure replacements run on the original string
(or use a single pass replacer) so every control char is converted before
returning; locate the escapeTurtleString function and add these additional
escapes to its replacement logic.
- Around line 1747-1749: The splitTurtleBlocks function currently uses
turtle.trim().split(/\n\s*\n/g) which splits on any blank line and can
incorrectly break Turtle multiline string literals or miss other block
boundaries; update the function by adding a clear comment above
splitTurtleBlocks stating that it deliberately splits on blank lines, that it
will not preserve blank lines inside multiline string literals (and therefore
may split inside """...""" or '''...''' literals), and note that a full
Turtle-aware parser would be needed to avoid this; optionally mention intended
acceptable input shape for callers (extraction source blocks) so future
maintainers know this limitation.
- Around line 2005-2008: The current conditional mixes checks on
term.datatype.value and isUrlLiteral(term.value) such that when datatype ===
XSD_ANY_URI_IRI but isUrlLiteral(...) is false the function returns undefined;
change the logic so that if term.datatype.value === XSD_ANY_URI_IRI you return
term.value unconditionally, otherwise only return term.value when
isUrlLiteral(term.value) is true. Update the conditional that currently uses
XSD_ANY_URI_IRI and isUrlLiteral to a simpler OR-based check (or two-branch
check) so the XSD_ANY_URI_IRI case always yields term.value and non-anyURI
relies on isUrlLiteral.
In `@src/runtime/weave/pages.ts`:
- Around line 2394-2403: The code calls
classifyHistoryComponentResourcePage(resourcePath, historyGroups) twice causing
duplicate work; fix by calling it once, storing the result in a local variable
(e.g., const classified = classifyHistoryComponentResourcePage(resourcePath,
historyGroups)), then if (classified) return classified; otherwise return the
rdfClass("sflo:DigitalArtifact", `${SFLO_NAMESPACE}DigitalArtifact`). Update the
block containing classifyHistoryComponentResourcePage, resourcePath,
historyGroups and the rdfClass fallback accordingly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 81126ba8-5968-4d53-bb3e-1757999e4494
📒 Files selected for processing (99)
.github/workflows/release-manual.yml.gitignoredefaults/application.ttldefaults/config-resolution.ttldeno.jsondocumentation/notes/dev.release-runbook.mddocumentation/notes/release-notes.v0.1.0.mddocumentation/notes/roadmap.mddocumentation/notes/wd.codebase-overview.mddocumentation/notes/wd.decision-log.mddocumentation/notes/wd.task.2026.2026-04-14_0018-configurable-test-tmp.mddocumentation/notes/wd.task.2026.2026-05-02-fantasy-rules-sidecar.mddocumentation/notes/wd.task.2026.2026-05-04-extraction-improvements.mddocumentation/notes/wd.task.2026.2026-05-04-refactor-planFirstPayloadWeave.mddocumentation/notes/wd.task.2026.2026-05-05-optional-history-and-slim-support-artifacts-by-default.mddocumentation/notes/wd.task.2026.2026-05-06-grand-config-synthesis.mddocumentation/notes/wd.task.2026.2026-05-07-fixture-ladder-generator.mddocumentation/notes/wd.task.2026.2026-05-13-full-ci-cd.mddocumentation/notes/wd.task.2026.2026-05-13_1142-refactor.mddocumentation/notes/wd.task.2026.2026-05-13_1655-support-gh-pages-branch-based-deployments.mddocumentation/notes/wd.task.2026.2026-05-14_1105-guarded-branch-published-rebuild.mddocumentation/notes/wu.cli-reference.mddocumentation/notes/wu.repository-options.mdscripts/assemble-npm-packages.tsscripts/build-binaries.tsscripts/bump-version.tsscripts/fixture-ladder.tsscripts/package-binaries.tsscripts/publish-npm-packages.tsscripts/release/archive.tsscripts/release/metadata.tsscripts/release/npm.tsscripts/smoke-npm-install.tssrc/cli/run.tssrc/core/extract/extract.tssrc/core/extract/extract_test.tssrc/core/integrate/integrate_test.tssrc/core/knop/add_reference.tssrc/core/knop/add_reference_test.tssrc/core/knop/create.tssrc/core/knop/create_test.tssrc/core/mesh/create.tssrc/core/mesh/create_test.tssrc/core/weave/errors.tssrc/core/weave/mesh_support_pages.tssrc/core/weave/naming_policy.tssrc/core/weave/resource_page_policy.tssrc/core/weave/support_history_policy.tssrc/core/weave/version_plan.tssrc/core/weave/weave.tssrc/core/weave/weave_test.tssrc/runtime/config/effective_config.tssrc/runtime/config/effective_config_test.tssrc/runtime/config/inheritance.tssrc/runtime/config/inheritance_test.tssrc/runtime/config/mod.tssrc/runtime/deploy/gh_pages.tssrc/runtime/deploy/mod.tssrc/runtime/extract/extract.tssrc/runtime/mesh/create.tssrc/runtime/mesh/inventory.tssrc/runtime/mesh/inventory_test.tssrc/runtime/mod.tssrc/runtime/operational/local_path_policy_test.tssrc/runtime/weave/page_definition.tssrc/runtime/weave/pages.tssrc/runtime/weave/pages_test.tssrc/runtime/weave/resource_page_policy.tssrc/runtime/weave/resource_page_policy_test.tssrc/runtime/weave/weave.tssrc/version.tssrc/version_test.tstests/e2e/deploy_gh_pages_cli_test.tstests/e2e/extract_cli_test.tstests/e2e/knop_create_cli_test.tstests/e2e/payload_update_cli_test.tstests/e2e/weave_cli_test.tstests/integration/branch_fantasy_rules_fixture_test.tstests/integration/deploy_gh_pages_test.tstests/integration/extract_test.tstests/integration/knop_create_test.tstests/integration/mesh_create_test.tstests/integration/ontology_guardrails_test.tstests/integration/payload_update_test.tstests/integration/validate_version_generate_test.tstests/integration/weave_test.tstests/scripts/assemble_npm_packages_test.tstests/scripts/bump_version_test.tstests/scripts/fixture_ladder_test.tstests/scripts/package_binaries_test.tstests/scripts/publish_npm_packages_test.tstests/scripts/release_metadata_test.tstests/scripts/smoke_npm_install_test.tstests/support/mesh_alice_bio_fixture.tstests/support/mesh_branch_fantasy_rules_fixture.tstests/support/mesh_metadata.tstests/support/mesh_sidecar_fantasy_rules_fixture.tstests/support/test_tmp.tsweave.code-workspace
💤 Files with no reviewable changes (1)
- documentation/notes/wd.task.2026.2026-05-07-fixture-ladder-generator.md
| const alreadyIntegrated = await pathExists( | ||
| join( | ||
| options.publishRoot, | ||
| `${toKnopPath(designatorPath)}/_inventory/inventory.ttl`, | ||
| ), | ||
| ); | ||
| let payloadNeedsWeave = false; | ||
|
|
||
| if (!alreadyIntegrated) { | ||
| await writeNewMaterializedSourceFile({ | ||
| absoluteTargetPath, | ||
| targetPath, | ||
| sourceBytes, | ||
| }); | ||
| createdPaths.push(targetPath); | ||
|
|
||
| const integrateResult = await executeIntegrate({ | ||
| meshRoot: options.publishRoot, | ||
| sourceBaseDirectory: options.publishRoot, | ||
| request: { | ||
| designatorPath, | ||
| source: targetPath, | ||
| }, | ||
| operationalLogger: options.operationalLogger, | ||
| auditLogger: options.auditLogger, | ||
| }); | ||
| createdPaths.push(...integrateResult.createdPaths); | ||
| updatedPaths.push(...integrateResult.updatedPaths); | ||
| payloadNeedsWeave = true; | ||
| } else if (await fileBytesDiffer(absoluteTargetPath, sourceBytes)) { | ||
| const payloadUpdateResult = await executePayloadUpdate({ | ||
| workspaceRoot: options.publishRoot, | ||
| request: { | ||
| designatorPath, | ||
| source: absoluteSourcePath, | ||
| }, | ||
| operationalLogger: options.operationalLogger, | ||
| auditLogger: options.auditLogger, | ||
| }); | ||
| updatedPaths.push(...payloadUpdateResult.updatedPaths); | ||
| payloadNeedsWeave = true; | ||
| } |
There was a problem hiding this comment.
Reject targetPath changes for an already-integrated designator.
Once alreadyIntegrated is true, this code never proves that the requested targetPath matches the artifact’s current working file. executePayloadUpdate() updates the existing payload identified by designatorPath, but upsertKnopSourceRegistry() records the new targetPath unconditionally. That can leave the registry pointing at a file that was never written.
Also applies to: 741-750
| async function loadEffectiveConfigForExecution( | ||
| historyTrackingPolicyOverride?: HistoryTrackingPolicy, | ||
| ): Promise<EffectiveConfig> { | ||
| const effectiveConfig = await loadWeaveDefaultEffectiveConfig(); | ||
| if (historyTrackingPolicyOverride === undefined) { | ||
| return effectiveConfig; | ||
| } | ||
|
|
||
| return new EffectiveConfigValue({ | ||
| sources: effectiveConfig.sources, | ||
| configResolution: effectiveConfig.configResolution, | ||
| namingPolicies: effectiveConfig.namingPolicies, | ||
| resourcePageRegenerationConfigPolicy: effectiveConfig | ||
| .resourcePageRegenerationConfigPolicy, | ||
| defaultHistoryTrackingPolicy: historyTrackingPolicyOverride, | ||
| historyTrackingByRole: new Map( | ||
| ALL_ARTIFACT_ROLES.map((role) => [ | ||
| role, | ||
| historyTrackingPolicyOverride, | ||
| ]), | ||
| ), | ||
| defaultResourcePageGenerationPolicy: "generate", | ||
| resourcePageGenerationByRole: new Map( | ||
| ALL_ARTIFACT_ROLES.map((role) => [ | ||
| role, | ||
| effectiveConfig.resourcePageGenerationPolicyForArtifactRole(role), | ||
| ]), | ||
| ), | ||
| }); |
There was a problem hiding this comment.
Load the workspace effective config instead of defaults.
This helper always starts from loadWeaveDefaultEffectiveConfig() and never reads the mesh’s resolved config, so executeVersion, executeGenerate, and executeWeave ignore repository-specific naming, history-tracking, and page-generation policy at runtime.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/runtime/weave/weave.ts` around lines 525 - 553, The helper
loadEffectiveConfigForExecution currently always calls
loadWeaveDefaultEffectiveConfig() — change it to start from the mesh/workspace
resolved effective config instead of the defaults (i.e., replace the call to
loadWeaveDefaultEffectiveConfig() with the function that returns the
mesh/resolved workspace EffectiveConfig), then construct the new
EffectiveConfigValue from that resolved config (preserve its sources,
configResolution, namingPolicies, resourcePageRegenerationConfigPolicy and
resourcePageGenerationPolicyForArtifactRole) and only apply
historyTrackingPolicyOverride to defaultHistoryTrackingPolicy and
historyTrackingByRole (using ALL_ARTIFACT_ROLES), leaving all other policies
from the resolved config intact.
- pin setup-deno and CI Deno versions - harden release script path and argument handling - validate gh-pages CNAME input and report updated paths - enforce source registry local-path policy - preserve inventory-resolved historical source snapshots - escape Turtle control characters in generated provenance - cover review fixes with focused regression tests see wa.review.2026-05-16_1413-coderabbit
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/runtime/mesh/inventory.ts (1)
281-334:⚠️ Potential issue | 🟠 Major | ⚡ Quick winFallback to inventory quads when source-registry Turtle is absent.
sourceRegistryTurtleis optional, but this path always reads extraction details fromsourceRegistryQuads. When it is omitted,sourceRegistryQuadsis empty and extracted designators fail withmissingExtractionSourceMessage.Use inventory quads as the fallback read source when registry Turtle is not provided.
Suggested fix
const sourceRegistryQuads = sourceRegistryTurtle === undefined ? [] : parseInventoryQuads( meshBase, sourceRegistryTurtle, messages.parseErrorMessage, ); + const extractionQuads = sourceRegistryTurtle === undefined + ? inventoryQuads + : sourceRegistryQuads; ... if ( !hasNamedNodeObject( - sourceRegistryQuads, + extractionQuads, extractionSourceIri, RDF_TYPE_IRI, SFLO_EXTRACTION_SOURCE_IRI, ) ) { throw new Error(messages.missingExtractionSourceMessage); } const sourceArtifactPath = resolveOptionalUniqueNamedNodePath( - sourceRegistryQuads, + extractionQuads, meshBase, extractionSourceIri, SFLO_HAS_TARGET_ARTIFACT_IRI, messages.missingTargetArtifactMessage, ); ... const requestedTargetStatePath = resolveOptionalUniqueNamedNodePath( - sourceRegistryQuads, + extractionQuads, meshBase, extractionSourceIri, SFLO_HAS_REQUESTED_TARGET_STATE_IRI, messages.missingRequestedTargetStateMessage, ); const artifactResolutionModeIri = resolveOptionalUniqueNamedNodeIri( - sourceRegistryQuads, + extractionQuads, extractionSourceIri, SFLO_HAS_ARTIFACT_RESOLUTION_MODE_IRI, messages.unsupportedResolutionModeMessage, ) ?? SFLO_ARTIFACT_RESOLUTION_MODE_CURRENT_IRI; ... ...resolveExtractionSourceEvidenceState( - sourceRegistryQuads, + extractionQuads, meshBase, extractionSourceIri, messages.parseErrorMessage, ),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/mesh/inventory.ts` around lines 281 - 334, The code sets sourceRegistryQuads to [] when sourceRegistryTurtle is undefined, causing lookups (extractionSourceIri, hasNamedNodeObject, resolveOptionalUniqueNamedNodePath) to fail; change the sourceRegistryQuads assignment to use inventoryQuads as the fallback read source (i.e., set sourceRegistryQuads = sourceRegistryTurtle === undefined ? inventoryQuads : parseInventoryQuads(...)) so subsequent calls to parse/extract using sourceRegistryQuads (used by extractionSourceIri, hasNamedNodeObject, resolveOptionalUniqueNamedNodePath, resolveOptionalUniqueNamedNodeIri) will correctly read from the inventory when the registry Turtle is absent.
♻️ Duplicate comments (1)
src/runtime/deploy/gh_pages.ts (1)
704-745:⚠️ Potential issue | 🟠 Major | ⚡ Quick winPrevent
targetPathregistry drift for already-integrated designators.When
alreadyIntegratedis true, the payload update operates on the designator’s existing working file, but the source registry is still upserted with the requestedtargetPath. If those differ, the registry can point at a path that was never written in this flow.Also applies to: 761-770
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/runtime/deploy/gh_pages.ts` around lines 704 - 745, When alreadyIntegrated is true, avoid registry drift by ensuring the payload update uses the actual working file path rather than the originally requested absoluteSourcePath; update the branch that calls executePayloadUpdate so the request.source refers to the existing target path used by the workspace (use targetPath or absoluteTargetPath as appropriate) and/or ensure the upsert logic inside executePayloadUpdate records the same path being written; update references around alreadyIntegrated, absoluteSourcePath, absoluteTargetPath, targetPath, executePayloadUpdate and payloadUpdateResult so the registry is upserted with the actual path that exists and not the originally requested source path.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@documentation/notes/wd.decision-log.md`:
- Around line 306-318: Replace the incorrect past/participial form "rerung" (and
plural "rerungs") with the correct "rerun" (and "reruns") in the decision text
entries—specifically update the phrase "branch-published ontology fixture for
the next rerung" to "next rerun" and any occurrence in the "Fixture Branches Are
Generated Outputs" section or decision lines referencing "rerung/rerungs" to use
"rerun/reruns" so the log is spelled correctly and searchable.
---
Outside diff comments:
In `@src/runtime/mesh/inventory.ts`:
- Around line 281-334: The code sets sourceRegistryQuads to [] when
sourceRegistryTurtle is undefined, causing lookups (extractionSourceIri,
hasNamedNodeObject, resolveOptionalUniqueNamedNodePath) to fail; change the
sourceRegistryQuads assignment to use inventoryQuads as the fallback read source
(i.e., set sourceRegistryQuads = sourceRegistryTurtle === undefined ?
inventoryQuads : parseInventoryQuads(...)) so subsequent calls to parse/extract
using sourceRegistryQuads (used by extractionSourceIri, hasNamedNodeObject,
resolveOptionalUniqueNamedNodePath, resolveOptionalUniqueNamedNodeIri) will
correctly read from the inventory when the registry Turtle is absent.
---
Duplicate comments:
In `@src/runtime/deploy/gh_pages.ts`:
- Around line 704-745: When alreadyIntegrated is true, avoid registry drift by
ensuring the payload update uses the actual working file path rather than the
originally requested absoluteSourcePath; update the branch that calls
executePayloadUpdate so the request.source refers to the existing target path
used by the workspace (use targetPath or absoluteTargetPath as appropriate)
and/or ensure the upsert logic inside executePayloadUpdate records the same path
being written; update references around alreadyIntegrated, absoluteSourcePath,
absoluteTargetPath, targetPath, executePayloadUpdate and payloadUpdateResult so
the registry is upserted with the actual path that exists and not the originally
requested source path.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 26e978cc-36d0-487f-b07a-6764edeebba0
📒 Files selected for processing (35)
.github/workflows/ci.yml.github/workflows/release-manual.ymldocumentation/notes/dev.release-runbook.mddocumentation/notes/release-notes.v0.1.0.mddocumentation/notes/wd.decision-log.mddocumentation/notes/wd.task.2026.2026-05-02-fantasy-rules-sidecar.mddocumentation/notes/wd.task.2026.2026-05-06-grand-config-synthesis.mddocumentation/notes/wd.task.2026.2026-05-13-full-ci-cd.mddocumentation/notes/wu.repository-options.mdscripts/assemble-npm-packages.tsscripts/build-binaries.tsscripts/bump-version.tsscripts/package-binaries.tsscripts/publish-npm-packages.tsscripts/smoke-npm-install.tssrc/cli/run.tssrc/core/extract/extract.tssrc/core/extract/extract_test.tssrc/core/integrate/integrate_test.tssrc/core/weave/weave.tssrc/core/weave/weave_test.tssrc/runtime/deploy/gh_pages.tssrc/runtime/extract/extract.tssrc/runtime/mesh/inventory.tssrc/runtime/mesh/inventory_test.tssrc/runtime/weave/pages.tssrc/runtime/weave/pages_test.tssrc/runtime/weave/weave.tstests/e2e/deploy_gh_pages_cli_test.tstests/integration/deploy_gh_pages_test.tstests/integration/validate_version_generate_test.tstests/integration/weave_test.tstests/scripts/bump_version_test.tstests/scripts/fixture_ladder_test.tstests/scripts/smoke_npm_install_test.ts
💤 Files with no reviewable changes (1)
- documentation/notes/wd.task.2026.2026-05-02-fantasy-rules-sidecar.md
✅ Files skipped from review due to trivial changes (3)
- documentation/notes/release-notes.v0.1.0.md
- documentation/notes/wu.repository-options.md
- documentation/notes/wd.task.2026.2026-05-06-grand-config-synthesis.md
🚧 Files skipped from review as they are similar to previous changes (16)
- src/core/integrate/integrate_test.ts
- src/runtime/mesh/inventory_test.ts
- .github/workflows/release-manual.yml
- scripts/build-binaries.ts
- scripts/assemble-npm-packages.ts
- scripts/smoke-npm-install.ts
- tests/e2e/deploy_gh_pages_cli_test.ts
- src/cli/run.ts
- src/core/extract/extract.ts
- scripts/package-binaries.ts
- src/core/extract/extract_test.ts
- src/runtime/weave/pages_test.ts
- src/runtime/weave/pages.ts
- src/runtime/extract/extract.ts
- src/runtime/weave/weave.ts
- src/core/weave/weave_test.ts
| - Decision: Treat Fantasy Rules as the branch-published ontology fixture for the next rerung, with authored ontology/source files on the source branch and all generated mesh output on the publication branch. | ||
| - References: [[wd.task.2026.2026-05-13_1655-support-gh-pages-branch-based-deployments]], [[wa.completed.2026.2026-05-07-fixture-ladder-generator]] | ||
| - Why: | ||
| - This proves the clean-source-branch story that motivated branch-published meshes: no generated `_mesh`, config, pages, histories, or local sibling paths need to live on the source branch. | ||
| - The older `docs/` sidecar topology remains valid, but it no longer needs to be the primary Fantasy Rules fixture once branch-published deployment is available. | ||
|
|
||
| ### 2026-05-14: Fixture Branches Are Generated Outputs | ||
|
|
||
| - Decision: Treat fixture branch ladders as disposable generated golden outputs produced from ordered scenario definitions plus Accord manifests, rather than hand-maintained source material. | ||
| - References: [[wa.completed.2026.2026-05-07-fixture-ladder-generator]] | ||
| - Why: | ||
| - Current fixture branches carry stale namespace and progression shapes, and pre-v1 Weave should regenerate them against the current contract rather than add compatibility shims. | ||
| - Broad fixture rerungs should be intentional, reviewable generated-output passes with branch writes behind an explicit flag. |
There was a problem hiding this comment.
Fix typo: use “rerun/reruns” instead of “rerung/rerungs”.
There are spelling errors in the new decision text; correcting them will keep the log clear and searchable.
🧰 Tools
🪛 LanguageTool
[grammar] ~306-~306: Ensure spelling is correct
Context: ...published ontology fixture for the next rerung, with authored ontology/source files on...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
[grammar] ~318-~318: Ensure spelling is correct
Context: ... compatibility shims. - Broad fixture rerungs should be intentional, reviewable gener...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@documentation/notes/wd.decision-log.md` around lines 306 - 318, Replace the
incorrect past/participial form "rerung" (and plural "rerungs") with the correct
"rerun" (and "reruns") in the decision text entries—specifically update the
phrase "branch-published ontology fixture for the next rerung" to "next rerun"
and any occurrence in the "Fixture Branches Are Generated Outputs" section or
decision lines referencing "rerung/rerungs" to use "rerun/reruns" so the log is
spelled correctly and searchable.
- upgrade the CI Codecov action to v6 - require Codecov upload success with fail_ci_if_error - upload the generated LCOV file as a dedicated artifact before Codecov - move coverage artifact upload to actions/upload-artifact v7
Summary by CodeRabbit
New Features
Documentation
Tests
Chores